<?xml version='1.0' encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <link href="cpip.css" rel="stylesheet" type="text/css" />
    <title>File: /Users/paulross/dev/Python-3.6.2/Include/longintrepr.h</title>
  </head>
  <body>
    <h1>File: /Users/paulross/dev/Python-3.6.2/Include/longintrepr.h</h1>
    <p>Green shading in the line number column
means the source is part of the translation unit, red means it is conditionally excluded.
Highlighted line numbers link to the translation unit page. Highlighted macros link to
the macro page.</p>
    <pre><a name="1" /><span class="True">       1:</span> <span class="f">#</span><span class="n">ifndef</span> <span class="b">Py_LIMITED_API</span>
<a name="2" /><span class="True">       2:</span> <span class="f">#</span><span class="n">ifndef</span> <a href="macros_noref.html#_UHlfTE9OR0lOVFJFUFJfSF8w"><span class="b">Py_LONGINTREPR_H</span></a>
<a name="3" /><span class="True">       3:</span> <span class="f">#</span><span class="n">define</span> <a href="macros_noref.html#_UHlfTE9OR0lOVFJFUFJfSF8w"><span class="b">Py_LONGINTREPR_H</span></a>
<a name="4" /><span class="False">       4:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">__cplusplus</span>
<a name="5" /><span class="False">       5:</span> <span class="m">extern</span> <span class="e">&quot;C&quot;</span> <span class="f">{</span>
<a name="6" /><span class="True">       6:</span> <span class="f">#</span><span class="n">endif</span>
<a name="7" /><span class="True">       7:</span> 
<a name="8" /><span class="True">       8:</span> 
<a name="9" /><span class="True">       9:</span> <span class="k">/* This is published for the benefit of &quot;friends&quot; marshal.c and _decimal.c. */</span>
<a name="10" /><span class="True">      10:</span> 
<a name="11" /><span class="True">      11:</span> <span class="k">/* Parameters of the integer representation.  There are two different</span>
<a name="12" /><span class="True">      12:</span> <span class="k">   sets of parameters: one set for 30-bit digits, stored in an unsigned 32-bit</span>
<a name="13" /><span class="True">      13:</span> <span class="k">   integer type, and one set for 15-bit digits with each digit stored in an</span>
<a name="14" /><span class="True">      14:</span> <span class="k">   unsigned short.  The value of PYLONG_BITS_IN_DIGIT, defined either at</span>
<a name="15" /><span class="True">      15:</span> <span class="k">   configure time or in pyport.h, is used to decide which digit size to use.</span>
<a name="16" /><span class="True">      16:</span> <span class="k"></span>
<a name="17" /><span class="True">      17:</span> <span class="k">   Type &apos;digit&apos; should be able to hold 2*PyLong_BASE-1, and type &apos;twodigits&apos;</span>
<a name="18" /><span class="True">      18:</span> <span class="k">   should be an unsigned integer type able to hold all integers up to</span>
<a name="19" /><span class="True">      19:</span> <span class="k">   PyLong_BASE*PyLong_BASE-1.  x_sub assumes that &apos;digit&apos; is an unsigned type,</span>
<a name="20" /><span class="True">      20:</span> <span class="k">   and that overflow is handled by taking the result modulo 2**N for some N &gt;</span>
<a name="21" /><span class="True">      21:</span> <span class="k">   PyLong_SHIFT.  The majority of the code doesn&apos;t care about the precise</span>
<a name="22" /><span class="True">      22:</span> <span class="k">   value of PyLong_SHIFT, but there are some notable exceptions:</span>
<a name="23" /><span class="True">      23:</span> <span class="k"></span>
<a name="24" /><span class="True">      24:</span> <span class="k">   - long_pow() requires that PyLong_SHIFT be divisible by 5</span>
<a name="25" /><span class="True">      25:</span> <span class="k"></span>
<a name="26" /><span class="True">      26:</span> <span class="k">   - PyLong_{As,From}ByteArray require that PyLong_SHIFT be at least 8</span>
<a name="27" /><span class="True">      27:</span> <span class="k"></span>
<a name="28" /><span class="True">      28:</span> <span class="k">   - long_hash() requires that PyLong_SHIFT is *strictly* less than the number</span>
<a name="29" /><span class="True">      29:</span> <span class="k">     of bits in an unsigned long, as do the PyLong &lt;-&gt; long (or unsigned long)</span>
<a name="30" /><span class="True">      30:</span> <span class="k">     conversion functions</span>
<a name="31" /><span class="True">      31:</span> <span class="k"></span>
<a name="32" /><span class="True">      32:</span> <span class="k">   - the Python int &lt;-&gt; size_t/Py_ssize_t conversion functions expect that</span>
<a name="33" /><span class="True">      33:</span> <span class="k">     PyLong_SHIFT is strictly less than the number of bits in a size_t</span>
<a name="34" /><span class="True">      34:</span> <span class="k"></span>
<a name="35" /><span class="True">      35:</span> <span class="k">   - the marshal code currently expects that PyLong_SHIFT is a multiple of 15</span>
<a name="36" /><span class="True">      36:</span> <span class="k"></span>
<a name="37" /><span class="True">      37:</span> <span class="k">   - NSMALLNEGINTS and NSMALLPOSINTS should be small enough to fit in a single</span>
<a name="38" /><span class="True">      38:</span> <span class="k">     digit; with the current values this forces PyLong_SHIFT &gt;= 9</span>
<a name="39" /><span class="True">      39:</span> <span class="k"></span>
<a name="40" /><span class="True">      40:</span> <span class="k">  The values 15 and 30 should fit all of the above requirements, on any</span>
<a name="41" /><span class="True">      41:</span> <span class="k">  platform.</span>
<a name="42" /><span class="True">      42:</span> <span class="k">*/</span>
<a name="43" /><span class="True">      43:</span> 
<a name="44" /><span class="True">      44:</span> <span class="f">#</span><span class="n">if</span> <a href="macros_ref.html#_UFlMT05HX0JJVFNfSU5fRElHSVRfMA__"><span class="b">PYLONG_BITS_IN_DIGIT</span></a> <span class="f">==</span> <span class="c">30</span>
<a name="45" /><span class="True">      45:</span> <span class="m">typedef</span> <span class="b">uint32_t</span> <span class="b">digit</span><span class="f">;</span>
<a name="46" /><span class="True">      46:</span> <span class="m">typedef</span> <span class="b">int32_t</span> <span class="b">sdigit</span><span class="f">;</span> <span class="k">/* signed variant of digit */</span>
<a name="47" /><span class="True">      47:</span> <span class="m">typedef</span> <span class="b">uint64_t</span> <span class="b">twodigits</span><span class="f">;</span>
<a name="48" /><span class="True">      48:</span> <span class="m">typedef</span> <span class="b">int64_t</span> <span class="b">stwodigits</span><span class="f">;</span> <span class="k">/* signed variant of twodigits */</span>
<a name="49" /><span class="True">      49:</span> <span class="f">#</span><span class="n">define</span> <a href="macros_ref.html#_UHlMb25nX1NISUZUXzA_"><span class="b">PyLong_SHIFT</span></a>    <span class="c">30</span>
<a name="50" /><span class="True">      50:</span> <span class="f">#</span><span class="n">define</span> <a href="macros_noref.html#_X1B5TG9uZ19ERUNJTUFMX1NISUZUXzA_"><span class="b">_PyLong_DECIMAL_SHIFT</span></a>    <span class="c">9</span> <span class="k">/* max(e such that 10**e fits in a digit) */</span>
<a name="51" /><span class="True">      51:</span> <span class="f">#</span><span class="n">define</span> <a href="macros_noref.html#_X1B5TG9uZ19ERUNJTUFMX0JBU0VfMA__"><span class="b">_PyLong_DECIMAL_BASE</span></a>    <span class="f">(</span><span class="f">(</span><span class="b">digit</span><span class="f">)</span><span class="c">1000000000</span><span class="f">)</span> <span class="k">/* 10 ** DECIMAL_SHIFT */</span>
<a name="52" /><span class="False">      52:</span> <span class="f">#</span><span class="n">elif</span> <a href="macros_ref.html#_UFlMT05HX0JJVFNfSU5fRElHSVRfMA__"><span class="b">PYLONG_BITS_IN_DIGIT</span></a> <span class="f">==</span> <span class="c">15</span>
<a name="53" /><span class="False">      53:</span> <span class="m">typedef</span> <span class="m">unsigned</span> <span class="m">short</span> <span class="b">digit</span><span class="f">;</span>
<a name="54" /><span class="False">      54:</span> <span class="m">typedef</span> <span class="m">short</span> <span class="b">sdigit</span><span class="f">;</span> <span class="k">/* signed variant of digit */</span>
<a name="55" /><span class="False">      55:</span> <span class="m">typedef</span> <span class="m">unsigned</span> <span class="m">long</span> <span class="b">twodigits</span><span class="f">;</span>
<a name="56" /><span class="False">      56:</span> <span class="m">typedef</span> <span class="m">long</span> <span class="b">stwodigits</span><span class="f">;</span> <span class="k">/* signed variant of twodigits */</span>
<a name="57" /><span class="False">      57:</span> <span class="f">#</span><span class="n">define</span> <a href="macros_ref.html#_UHlMb25nX1NISUZUXzA_"><span class="b">PyLong_SHIFT</span></a>    <span class="c">15</span>
<a name="58" /><span class="False">      58:</span> <span class="f">#</span><span class="n">define</span> <a href="macros_noref.html#_X1B5TG9uZ19ERUNJTUFMX1NISUZUXzA_"><span class="b">_PyLong_DECIMAL_SHIFT</span></a>    <span class="c">4</span> <span class="k">/* max(e such that 10**e fits in a digit) */</span>
<a name="59" /><span class="False">      59:</span> <span class="f">#</span><span class="n">define</span> <a href="macros_noref.html#_X1B5TG9uZ19ERUNJTUFMX0JBU0VfMA__"><span class="b">_PyLong_DECIMAL_BASE</span></a>    <span class="f">(</span><span class="f">(</span><span class="b">digit</span><span class="f">)</span><span class="c">10000</span><span class="f">)</span> <span class="k">/* 10 ** DECIMAL_SHIFT */</span>
<a name="60" /><span class="False">      60:</span> <span class="f">#</span><span class="n">else</span>
<a name="61" /><span class="False">      61:</span> <span class="f">#</span><span class="n">error</span> <span class="e">&quot;PYLONG_BITS_IN_DIGIT should be 15 or 30&quot;</span>
<a name="62" /><span class="True">      62:</span> <span class="f">#</span><span class="n">endif</span>
<a name="63" /><span class="True">      63:</span> <span class="f">#</span><span class="n">define</span> <a href="macros_noref.html#_UHlMb25nX0JBU0VfMA__"><span class="b">PyLong_BASE</span></a>    <span class="f">(</span><span class="f">(</span><span class="b">digit</span><span class="f">)</span><span class="c">1</span> <span class="f">&lt;&lt;</span> <a href="macros_ref.html#_UHlMb25nX1NISUZUXzA_"><span class="b">PyLong_SHIFT</span></a><span class="f">)</span>
<a name="64" /><span class="True">      64:</span> <span class="f">#</span><span class="n">define</span> <a href="macros_noref.html#_UHlMb25nX01BU0tfMA__"><span class="b">PyLong_MASK</span></a>    <span class="f">(</span><span class="f">(</span><span class="b">digit</span><span class="f">)</span><span class="f">(</span><a href="macros_noref.html#_UHlMb25nX0JBU0VfMA__"><span class="b">PyLong_BASE</span></a> <span class="f">-</span> <span class="c">1</span><span class="f">)</span><span class="f">)</span>
<a name="65" /><span class="True">      65:</span> 
<a name="66" /><span class="False">      66:</span> <span class="f">#</span><span class="n">if</span> <a href="macros_ref.html#_UHlMb25nX1NISUZUXzA_"><span class="b">PyLong_SHIFT</span></a> <span class="f">%</span> <span class="c">5</span> <span class="f">!=</span> <span class="c">0</span>
<a name="67" /><span class="False">      67:</span> <span class="f">#</span><span class="n">error</span> <span class="e">&quot;longobject.c requires that PyLong_SHIFT be divisible by 5&quot;</span>
<a name="68" /><span class="True">      68:</span> <span class="f">#</span><span class="n">endif</span>
<a name="69" /><span class="True">      69:</span> 
<a name="70" /><span class="True">      70:</span> <span class="k">/* Long integer representation.</span>
<a name="71" /><span class="True">      71:</span> <span class="k">   The absolute value of a number is equal to</span>
<a name="72" /><span class="True">      72:</span> <span class="k">       SUM(for i=0 through abs(ob_size)-1) ob_digit[i] * 2**(SHIFT*i)</span>
<a name="73" /><span class="True">      73:</span> <span class="k">   Negative numbers are represented with ob_size &lt; 0;</span>
<a name="74" /><span class="True">      74:</span> <span class="k">   zero is represented by ob_size == 0.</span>
<a name="75" /><span class="True">      75:</span> <span class="k">   In a normalized number, ob_digit[abs(ob_size)-1] (the most significant</span>
<a name="76" /><span class="True">      76:</span> <span class="k">   digit) is never zero.  Also, in all cases, for all valid i,</span>
<a name="77" /><span class="True">      77:</span> <span class="k">       0 &lt;= ob_digit[i] &lt;= MASK.</span>
<a name="78" /><span class="True">      78:</span> <span class="k">   The allocation function takes care of allocating extra memory</span>
<a name="79" /><span class="True">      79:</span> <span class="k">   so that ob_digit[0] ... ob_digit[abs(ob_size)-1] are actually available.</span>
<a name="80" /><span class="True">      80:</span> <span class="k"></span>
<a name="81" /><span class="True">      81:</span> <span class="k">   CAUTION:  Generic code manipulating subtypes of PyVarObject has to</span>
<a name="82" /><span class="True">      82:</span> <span class="k">   aware that ints abuse  ob_size&apos;s sign bit.</span>
<a name="83" /><span class="True">      83:</span> <span class="k">*/</span>
<a name="84" /><span class="True">      84:</span> 
<a name="85" /><span class="True">      85:</span> <span class="m">struct</span> <span class="b">_longobject</span> <span class="f">{</span>
<a name="86" /><span class="True">      86:</span>     <a href="macros_ref.html#_UHlPYmplY3RfVkFSX0hFQURfMA__"><span class="b">PyObject_VAR_HEAD</span></a>
<a name="87" /><span class="True">      87:</span>     <span class="b">digit</span> <span class="b">ob_digit</span><span class="f">[</span><span class="c">1</span><span class="f">]</span><span class="f">;</span>
<a name="88" /><span class="True">      88:</span> <span class="f">}</span><span class="f">;</span>
<a name="89" /><span class="True">      89:</span> 
<a name="90" /><span class="True">      90:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="b">PyLongObject</span> <span class="f">*</span><span class="f">)</span> <span class="b">_PyLong_New</span><span class="f">(</span><span class="b">Py_ssize_t</span><span class="f">)</span><span class="f">;</span>
<a name="91" /><span class="True">      91:</span> 
<a name="92" /><span class="True">      92:</span> <span class="k">/* Return a copy of src. */</span>
<a name="93" /><span class="True">      93:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="b">PyObject</span> <span class="f">*</span><span class="f">)</span> <span class="b">_PyLong_Copy</span><span class="f">(</span><span class="b">PyLongObject</span> <span class="f">*</span><span class="b">src</span><span class="f">)</span><span class="f">;</span>
<a name="94" /><span class="True">      94:</span> 
<a name="95" /><span class="False">      95:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">__cplusplus</span>
<a name="96" /><span class="False">      96:</span> <span class="f">}</span>
<a name="97" /><span class="True">      97:</span> <span class="f">#</span><span class="n">endif</span>
<a name="98" /><span class="True">      98:</span> <span class="f">#</span><span class="n">endif</span> <span class="k">/* !Py_LONGINTREPR_H */</span>
<a name="99" /><span class="True">      99:</span> <span class="f">#</span><span class="n">endif</span> <span class="k">/* Py_LIMITED_API */</span>
<a name="100" /><span class="True">     100:</span> </pre>
  </body>
</html>
